//当前文件是设置的中间件 主要功能是做短token验证
const { secret } = require('./token');
const jwt = require('jsonwebtoken');

// web前端白名单
const web = ["/bigfill/addChapter", "/course", '/course_add', '/course_edit', '/course_all']

// 后端设置的白名单 
const appwhite = ['/zn/login', '/zn/refresh', '/zn/adduser', '/zn/payment', '/sms/get_sms', '/zn/queryOrder'
    , '/zn/refund', '/zn/order', '/yym/msglist', '/yym/saveMsg', '/wq/searchAddress', '/wq/map', '/wq/getShopInfo', '/wq/getDetail', '/wq/pay'];
const whiteList = web.concat(appwhite);
//函数是判断访问的url是否在白名单中 在白名单中则不进行token验证 可以直接访问
const isWhiteList = (url, whiteList) => {
    if (url.indexOf('?') > 0) {
        url = url.split('?')[0]
    }
    return whiteList.find(item => item === url) ? true : false;
}

//中间件验证短token是否有效
const auth = async (req, res, next) => {
    //获取到请求的url
    let url = req.url;
    //判断访问的url是否在白名单中
    if (isWhiteList(url, whiteList)) {
        //执行下一步
        return await next();
    } else {
        //获取请求头携带的短token
        const a_tk = req.headers.accesstoken;
        //首先判断是否存在短token
        if (!a_tk) {
            return res.send({//短token不存在则返回
                code: 402,
                msg: 'accessToken无效，不存在'
            })
        } else {
            //短token存在 则解析token 判断短token是否有效
            await jwt.verify(a_tk, secret, async (err, data) => {
                if (err) {//无效则返回
                    return res.send({
                        code: 401,
                        msg: 'accessToken无效，无权限访问'
                    })
                } else {//有效则执行下一步
                    return await next();
                }
            })
        }


    }
}

module.exports = {
    auth
}